package cn.ad.service;

import cn.ad.handler.SqlSessionHandler;
import cn.ad.model.MediaRptResult;
import cn.ad.model.SearchParams;
import cn.ad.model.SpaceSearch;
import cn.ad.util.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class MediaRptSerivce {

	@Autowired
	private SqlSessionHandler sqlSessionHandler;

	/**
	 * 根据单个媒体的id，时间段 查询 rpt_media_daily 和 rpt_media_hourly 表 查询媒体的统计数据 ---合计
	 * 
	 * @param id
	 *            媒体 ID
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 * @return
	 */
	public MediaRptResult getSum(List<Integer> id, Date startTime, Date endTime) {
		if(id==null||id.size()==0){
			return new MediaRptResult();
		}
		Date currentDateStartTime = Utils.getStartTime(Calendar.getInstance().getTime());
		if (currentDateStartTime.getTime() < startTime.getTime()) {
			return new MediaRptResult();
		}
		SearchParams search = new SearchParams(id, startTime, endTime);
		Utils.resizeSearch(search, startTime, endTime);
		MediaRptResult model = sqlSessionHandler.selectOne("rptMediaMapper.report:media:sum", search);
		return model;
	}

	/**
	 * 根据单个媒体的id，时间段 查询 rpt_media_daily 和 rpt_media_hourly 表 查询媒体的统计数据
	 * ---一天的话按小时分组，多天按天分组
	 * 
	 * @param id
	 *            媒体 ID
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 * @return
	 */
	public List<MediaRptResult> getSumList(List<Integer> id, Date startTime, Date endTime) {
		if(id==null||id.size()==0){
			return new ArrayList<>();
		}
		if (startTime.equals(endTime)) {
			// 查询时报列表
			return getHourSumList(id, startTime);
		} else {
			// 查询日报列表
			return getDaySumList(id, startTime, endTime);
		}

	}

	/**
	 * 查询时报列表
	 * 
	 * @param id
	 *            媒体id
	 * @param time
	 *            查询的时报日期
	 * @return
	 */
	private List<MediaRptResult> getHourSumList(List<Integer> id, Date time) {
		Map map = new HashMap<String, Object>(2);
		map.put("id", id);
		map.put("searchTime", time);
		return sqlSessionHandler.selectList("rptMediaMapper.media:day:sum:list", map);
	}

	/**
	 * 查询时报列表
	 * 
	 * @param id
	 *            媒体id
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 * @return
	 */
	private List<MediaRptResult> getDaySumList(List<Integer> id, Date startTime, Date endTime) {
		if(id==null||id.size()==0){
			return new ArrayList<>();
		}
		Date currentDateStartTime = Utils.getStartTime(Calendar.getInstance().getTime());
		if (currentDateStartTime.getTime() < startTime.getTime()) {
			return new ArrayList<>();
		}
		SearchParams search = new SearchParams(id, startTime, endTime);
		Utils.resizeSearch(search, startTime, endTime);
		List<MediaRptResult> model = sqlSessionHandler.selectList("rptMediaMapper.report:media:sum:list", search);
		return model;
	}

	/**
	 * 根据单个媒体的id，时间段 查询 rpt_media_geo_daily 表查询到 地域统计信息。按城市分组。
	 * 
	 * @param id
	 *            媒体 ID
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 * @return
	 */
	public List<MediaRptResult> getGeoCityList(List<Integer> id, Date startTime, Date endTime) {
		if(id==null||id.size()==0){
			return new ArrayList<>();
		}
		Date currentDateStartTime = Utils.getStartTime(Calendar.getInstance().getTime());
		if (currentDateStartTime.getTime() < startTime.getTime()) {
			return new ArrayList<>();
		}
		SearchParams search = new SearchParams(id, startTime, endTime);
		List<MediaRptResult> model = sqlSessionHandler.selectList("rptMediaGeoMapper.report:media:geo:sum:list", search);
		return model;
	}

	/**
	 * 根据单个媒体的id，时间段，城市ids 查询 rpt_media_geo_daily 表查询到 地域定向统计信息，计算合计。组成省份数据
	 * 
	 * @param id
	 *            媒体 ID
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 * @return
	 */
	public MediaRptResult getGeoStateList(List<Integer> id, List<Integer> ids, Date startTime, Date endTime) {
		if(id==null||id.size()==0){
			return null;
		}
		Date currentDateStartTime = Utils.getStartTime(Calendar.getInstance().getTime());
		if (currentDateStartTime.getTime() < startTime.getTime()) {
			return null;
		}
		SearchParams search = new SearchParams(id, startTime, endTime);
		search.setIds(ids);
		MediaRptResult model = sqlSessionHandler.selectOne("rptMediaGeoMapper.report:media:geo:sum", search);
		return model;
	}

	/**
	 * 查询指定媒体下的指定广告位的时间纬度的数据报告列表
	 * 
	 * @param adspaceId
	 *            媒体 ID
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 * @return
	 */
	public List<MediaRptResult> getMediaAdSpaceTimeReportList(Integer adspaceId, Date startTime, Date endTime) {
		if (startTime == null || endTime == null) {
			throw new IllegalArgumentException("开始时间和结束时间不能为null。数据错误。");
		}
		
        Date now = Utils.getStartTime(Calendar.getInstance().getTime());
        
        // 查询时间为将来的某一段时间 返回空
		if (startTime.getTime() > now.getTime()) {
			return new ArrayList<>();
		}

		Map<String, Object> searchParam = new HashMap<>();
		searchParam.put("adspaceId", adspaceId);
		
		// 过去的某一天或者今天 查询时报
		if ((startTime.getTime() == endTime.getTime() && endTime.getTime() < now.getTime())
				|| startTime.getTime() == now.getTime()) {
			searchParam.put("startTime", startTime);
			return sqlSessionHandler.selectList("rptMediaAdSpaceMapper.report:media:adspace:hourly:list", searchParam);
		}
	
		// 一段时间的报告
		this.getSearchParam(searchParam,startTime,endTime,now);
		return sqlSessionHandler.selectList("rptMediaAdSpaceMapper.report:media:adspace:daily:list", searchParam);

	}

	private void getSearchParam(Map<String, Object> searchParam, Date startTime, Date endTime, Date now) {
		// 一段时间的报告
		if (startTime.getTime() < now.getTime() && endTime.getTime() >= now.getTime()) {
			// 过去的日报+今天的时报
			searchParam.put("isToday", 2);
			searchParam.put("startTime", startTime);
			searchParam.put("endTime", endTime);
		} else if (endTime.getTime() < now.getTime()) {
			// 日报
			searchParam.put("isToday", 1);
			searchParam.put("startTime", startTime);
			searchParam.put("endTime", endTime);
		}
	}

	public MediaRptResult getMediaAdSpaceTimeSumReport(Integer adspaceId, Date startTime, Date endTime) {
		if (startTime == null || endTime == null) {
			throw new IllegalArgumentException("开始时间和结束时间不能为null。数据错误。");
		}

		Date now = Utils.getStartTime(Calendar.getInstance().getTime());

		// 查询时间为将来的某一段时间 返回空
		if (startTime.getTime() > now.getTime()) {
			return new MediaRptResult();
		}

		Map<String, Object> searchParam = new HashMap<>();
		searchParam.put("adspaceId", adspaceId);

		// 今天 查询时报
		if (startTime.getTime() == now.getTime()) {
			searchParam.put("isToday", 0);
			searchParam.put("startTime", startTime);
			return sqlSessionHandler.selectOne("rptMediaAdSpaceMapper.report:media:adspace:daily:list:sum", searchParam);
		}
		this.getSearchParam(searchParam,startTime,endTime,now);
		return sqlSessionHandler.selectOne("rptMediaAdSpaceMapper.report:media:adspace:daily:list:sum", searchParam);
	}


	/**
	 * 根据单个广告位的id，时间段 查询 rpt_media_adspace_geo_daily 表查询到 地域统计信息。按城市分组。
	 * @param id 广告位 ID
	 * @param startTime 开始时间
	 * @param endTime   结束时间
	 * @return
	 */
	public List<MediaRptResult> getAdSpaceGeoCityList(Integer id, Date startTime, Date endTime) {
		Date currentDateStartTime = Utils.getStartTime(Calendar.getInstance().getTime());
		if (currentDateStartTime.getTime() < startTime.getTime()) {
			return new ArrayList<>();
		}
		SpaceSearch spaceSearch = new SpaceSearch();
		spaceSearch.setSid(id);
		spaceSearch.setStartTime(startTime);
		spaceSearch.setEndTime(endTime);
		List<MediaRptResult> model = sqlSessionHandler.selectList("rptMediaAdSPaceGeoMapper.report:media:adspace:geo:sum:list", spaceSearch);
		return model;
	}
	
	/**
	 * 根据单个广告位的id，时间段，城市ids  查询 rpt_media_adspace_geo_daily 表查询到 地域定向统计信息，计算合计。组成省份数据
	 * @param id 广告位 ID
	 * @param startTime 开始时间
	 * @param endTime   结束时间
	 * @return
	 */
	public MediaRptResult getAdSpaceGeoStateList(Integer id, List<Integer> ids, Date startTime, Date endTime) {
		Date currentDateStartTime = Utils.getStartTime(Calendar.getInstance().getTime());
		if (currentDateStartTime.getTime() < startTime.getTime()) {
			return new MediaRptResult();
		}
		SpaceSearch spaceSearch = new SpaceSearch();
		spaceSearch.setSid(id);
		spaceSearch.setIds(ids);
		spaceSearch.setStartTime(startTime);
		spaceSearch.setEndTime(endTime);
		MediaRptResult model = sqlSessionHandler.selectOne("rptMediaAdSPaceGeoMapper.report:media:adspace:geo:sum", spaceSearch);
		return model;
	}

	/**
	 * 根据广告位集合，时间段 查询 gdt_ssp_adspace_daily 表查询到 地域统计信息。按城市分组。
	 * @param id 媒体 ID
	 * @param startTime 开始时间
	 * @param endTime   结束时间
     * @return
     */
	public List<MediaRptResult> getGdtSpaceList(List<Integer> id, Date startTime, Date endTime) {
		if(id==null||id.size()==0){
			return new ArrayList<>();
		}
		if (startTime == null || endTime == null) {
			throw new IllegalArgumentException("开始时间和结束时间不能为null。数据错误。");
		}
		Date now = Utils.getStartTime(Calendar.getInstance().getTime());

		// 查询时间为将来的某一段时间 返回空
		if (startTime.getTime() > now.getTime() || startTime.getTime() > endTime.getTime() || null == id  || id.size() == 0) {
			return new ArrayList<>();
		}
		Map<String, Object> searchParam = new HashMap<>();
		searchParam.put("adspaceIds", id);
		searchParam.put("startTime", startTime);
		searchParam.put("endTime", endTime);
		return sqlSessionHandler.selectList("rptGdtAdSpaceMapper.report:media:adspace:daily:list", searchParam);
	}

	public List<MediaRptResult> getGdtSpaceSum(List<Integer> id, Date startTime, Date endTime) {
		if(id==null||id.size()==0){
			return new ArrayList<>();
		}
		if (startTime == null || endTime == null) {
			throw new IllegalArgumentException("开始时间和结束时间不能为null。数据错误。");
		}
		Date now = Utils.getStartTime(Calendar.getInstance().getTime());

		// 查询时间为将来的某一段时间 返回空
		if (startTime.getTime() > now.getTime() || startTime.getTime() > endTime.getTime()|| null == id  || id.size() == 0) {
			return new ArrayList<>();
		}
		Map<String, Object> searchParam = new HashMap<>();
		searchParam.put("adspaceIds", id);
		searchParam.put("startTime", startTime);
		searchParam.put("endTime", endTime);
		List<MediaRptResult> mediaRptResultList = sqlSessionHandler.selectList("rptGdtAdSpaceMapper.report:media:adspace:daily:list:sum", searchParam);
		if(null == mediaRptResultList) {
			mediaRptResultList = new ArrayList<>();
		}
		return mediaRptResultList;
	}

}
